from typing import Dict, List

from chromadb.api.models.Collection import Collection

from llms.zhipu import chat, embeddings_cal
from prompts.inteview_prompt import PRE_EXTRACT
from mapper.interview_question import insert_into_sql_with_ids
from utils.parse_utils import parse_markdown_json_content


# 使用llm提取问题
# 输入，面经数据
# 输出，抽取到的面试问题、面试岗位、面试公司
def extract_interview_question(data: str):
    prompt = PRE_EXTRACT.format(data=data)
    response = chat([{"role": "user", "content": prompt}])
    return parse_markdown_json_content(response)


def insert_extract_interview(collection: Collection, result_list: List[Dict]):
    """
    批量插入面试提取结果到 SQL 和 Chroma 向量库中，复用一个 ID
    :param session: SQLAlchemy 的数据库会话
    :param collection: Chroma 向量数据库集合
    :param result_list: 从 LLM 提取的面试问题列表
    """
    # 1. 批量插入到 SQL 数据库，并返回带 ID 的数据
    questions_with_ids = insert_into_sql_with_ids(result_list)

    # 2. 批量插入到 Chroma 向量库（复用 SQL 表的 ID）
    insert_into_chroma_with_ids(collection, questions_with_ids)


def insert_into_chroma_with_ids(collection, questions_with_ids: List[Dict]):
    """
    批量插入问题的向量及元数据到 Chroma 库，使用共用的 SQL 表 ID
    :param collection: Chroma 向量库集合
    :param questions_with_ids: 包含 ID 的带元数据的问题列表
    """
    embeddings = []  # 存储所有问题的向量
    metadatas = []  # 存储每条问题的元信息
    ids = []  # 存储唯一 ID（来源于 SQL 表的 ID）
    question_list = [date['question'] for date in questions_with_ids]
    embedding_list = embeddings_cal(question_list)
    for index, data in enumerate(questions_with_ids):
        question_id = data["id"]  # 使用 SQL 表生成的 ID
        company = data["company"]
        position = data["position"]
        question = data["question"]

        # 计算问题的向量（向量化）
        embedding = embedding_list[index]
        embeddings.append(embedding)

        # 构造元数据
        metadatas.append({
            "company_name": company,
            "job_position": position,
            "question": question
        })

        # 共用 ID
        ids.append(str(question_id))  # 如果 ID 是数字，需转为字符串

    # 批量插入到 Chroma 集合
    collection.add(
        embeddings=embeddings,
        metadatas=metadatas,
        ids=ids
    )
    print(f"成功将 {len(embeddings)} 条面试问题向量存储到 Chroma 向量库！")


# def main():
    # 样本数据
    # result_list = [
    #     {
    #         "company": "字节跳动",
    #         "position": "产品经理",
    #         "questions": [
    #             {"question_text": "请简要介绍一下您的工作经历和职责。", "question_score": 9.0},
    #             {"question_text": "您认为，作为产品经理，非常重要的三项技能或素质是什么？", "question_score": 8.5},
    #             {"question_text": "请举例说明您曾经成功推出的一款产品，并说明您在项目中扮演的角色以及贡献。",
    #              "question_score": 9.0},
    #             {"question_text": "如何理解字节跳动公司的企业文化和价值观？", "question_score": 8.0},
    #             {"question_text": "在您看来，字节跳动公司的优势和劣势分别是什么？", "question_score": 7.5},
    #             {"question_text": "如何看待字节跳动公司在短视频、资讯等领域的竞争格局？", "question_score": 8.0},
    #             {"question_text": "请谈谈您对抖音、今日头条等字节跳动公司产品的看法。", "question_score": 7.5},
    #             {"question_text": "如何理解产品经理在项目中的角色，是决策者还是执行者？", "question_score": 8.5},
    #             {"question_text": "请描述一个您在产品策划过程中遇到的难题，并说明您是如何解决的。",
    #              "question_score": 9.0},
    #             {"question_text": "您如何评估一款产品的成功与失败？", "question_score": 9.0},
    #             {"question_text": "请谈谈您在团队协作中的经验，如何与开发、设计、运营等团队成员有效沟通？",
    #              "question_score": 9.0},
    #             {"question_text": "如何应对团队成员对产品方案提出的不同意见？", "question_score": 8.5},
    #             {"question_text": "请谈谈您在用户需求分析和市场调研方面的经验。", "question_score": 8.5},
    #             {"question_text": "如何理解数据驱动的产品迭代？请举例说明。", "question_score": 9.0},
    #             {"question_text": "请谈谈您在产品运营和推广方面的经验。", "question_score": 8.0},
    #             {"question_text": "如何看待产品的盈利模式和商业化？", "question_score": 8.0},
    #             {"question_text": "请谈谈您在竞品分析和行业趋势分析方面的经验。", "question_score": 8.5},
    #             {"question_text": "如何处理产品上线后的用户反馈和投诉？", "question_score": 8.5},
    #             {"question_text": "请谈谈您在跨部门协作和资源整合方面的经验。", "question_score": 8.5},
    #             {"question_text": "在面对多项目并行的情况下，如何合理安排时间和精力？", "question_score": 8.5},
    #             {"question_text": "请先做个自我介绍。", "question_score": 7.0},
    #             {"question_text": "上一份工作离职的原因。", "question_score": 6.5},
    #             {"question_text": "说下你应聘这个岗位的优劣势。", "question_score": 7.5},
    #             {"question_text": "你长期的职业生涯规划是什么？", "question_score": 7.5},
    #             {"question_text": "能否谈一下你对这个职位的认识。", "question_score": 7.5},
    #             {"question_text": "为什么选择我们公司？", "question_score": 7.0},
    #             {"question_text": "可否谈一下你的兴趣爱好和特长。", "question_score": 6.0},
    #             {"question_text": "你期望的薪酬是多少？", "question_score": 5.5},
    #             {"question_text": "能否接受加班/出差/调配？", "question_score": 5.5},
    #             {"question_text": "你还有什么其他问题想要了解的？", "question_score": 6.0}
    #         ]
    #     }
    # ]

    # 初始化数据库和会话
    # init_db()  # 初始化 SQL 数据库并创建表（只需运行一次）


    # # 初始化 Chroma 数据库
    # chroma_client = init_chroma_db()
    # chroma_collection = create_chroma_collection(chroma_client)

    # 批量插入提取结果（共用 ID）
    # insert_extract_interview(session, chroma_collection, result_list)
    # questions_with_ids = insert_into_sql_with_ids(session, result_list)
    # questions = query_questions_by_company_and_position(session, "字节跳动", "产品经理")
    #
    # print(questions)

# if __name__ == "__main__":
#     main()
